package com.example.show_auto.network

import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import okhttp3.OkHttpClient
import okhttp3.Request
import org.json.JSONObject
import java.util.concurrent.TimeUnit

/**
 * API服务类
 * 实现与web项目相同的个人数据获取逻辑
 */
class ApiService {
    
    private val client = OkHttpClient.Builder()
        .connectTimeout(10, TimeUnit.SECONDS)
        .readTimeout(30, TimeUnit.SECONDS)
        .writeTimeout(30, TimeUnit.SECONDS)
        .build()
    
    /**
     * 获取个人数据
     * 对应web项目中的个人数据导入功能
     * 
     * @param token 校验码/令牌
     * @return 个人数据JSON字符串
     */
    suspend fun getPersonalData(token: String): Result<String> = withContext(Dispatchers.IO) {
        try {
            // 构建请求URL，模拟web项目的API调用
            val timestamp = System.currentTimeMillis()
            val url = "https://yx518.com/api/archive.do?token=$token&_=$timestamp"

            val request = Request.Builder()
                .url(url)
                .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36")
                .addHeader("Referer", "https://yx518.com/")
                .addHeader("Accept", "application/json, text/javascript, */*; q=0.01")
                .addHeader("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8")
                .build()

            val response = client.newCall(request).execute()

            if (response.isSuccessful) {
                val responseBody = response.body?.string()
                if (responseBody != null) {
                    // 验证返回的数据格式
                    validatePersonalDataResponse(responseBody)
                    Result.success(responseBody)
                } else {
                    Result.failure(Exception("校验码过期，请重新获取白菜菊花码后再次导入！"))
                }
            } else {
                when (response.code) {
                    401 -> Result.failure(Exception("校验码过期，请重新获取白菜菊花码后再次导入！"))
                    404 -> Result.failure(Exception("校验码过期，请重新获取白菜菊花码后再次导入！"))
                    500 -> Result.failure(Exception("校验码过期，请重新获取白菜菊花码后再次导入！"))
                    else -> Result.failure(Exception("校验码过期，请重新获取白菜菊花码后再次导入！"))
                }
            }
        } catch (e: java.net.UnknownHostException) {
            Result.failure(Exception("校验码过期，请重新获取白菜菊花码后再次导入！"))
        } catch (e: java.net.SocketTimeoutException) {
            Result.failure(Exception("校验码过期，请重新获取白菜菊花码后再次导入！"))
        } catch (e: java.net.ConnectException) {
            Result.failure(Exception("校验码过期，请重新获取白菜菊花码后再次导入！"))
        } catch (e: javax.net.ssl.SSLException) {
            Result.failure(Exception("校验码过期，请重新获取白菜菊花码后再次导入！"))
        } catch (e: Exception) {
            Result.failure(Exception("校验码过期，请重新获取白菜菊花码后再次导入！"))
        }
    }


    
    /**
     * 验证个人数据响应格式
     */
    private fun validatePersonalDataResponse(responseBody: String) {
        try {
            val json = JSONObject(responseBody)

            // 检查是否是错误响应
            if (json.has("error")) {
                val errorMsg = json.optString("error", "未知错误")
                throw Exception("校验码过期，请重新获取白菜菊花码后再次导入！")
            }

            // 检查是否包含数据字段（至少有一个）
            if (!json.has("recipes") && !json.has("chefs") && !json.has("data")) {
                // 如果都没有，可能是其他格式的响应，尝试解析
                if (responseBody.contains("recipes") || responseBody.contains("chefs")) {
                    // 包含关键字，可能是有效数据
                    return
                }
                throw Exception("校验码过期，请重新获取白菜菊花码后再次导入！")
            }

        } catch (e: org.json.JSONException) {
            // JSON解析失败，可能不是JSON格式
            if (responseBody.trim().isEmpty()) {
                throw Exception("校验码过期，请重新获取白菜菊花码后再次导入！")
            } else if (responseBody.contains("<!DOCTYPE html>") || responseBody.contains("<html")) {
                throw Exception("校验码过期，请重新获取白菜菊花码后再次导入！")
            } else {
                throw Exception("校验码过期，请重新获取白菜菊花码后再次导入！")
            }
        } catch (e: Exception) {
            if (e.message?.contains("校验码过期") == true) {
                throw e
            } else {
                throw Exception("校验码过期，请重新获取白菜菊花码后再次导入！")
            }
        }
    }
    
    /**
     * 测试网络连接
     */
    suspend fun testConnection(): Result<Boolean> = withContext(Dispatchers.IO) {
        try {
            val request = Request.Builder()
                .url("https://yx518.com/")
                .head() // 只获取头部信息
                .build()
            
            val response = client.newCall(request).execute()
            Result.success(response.isSuccessful)
        } catch (e: Exception) {
            Result.failure(Exception("网络连接测试失败: ${e.message}"))
        }
    }
}

/**
 * 个人数据模型
 * 对应API返回的数据结构
 */
data class PersonalDataResponse(
    val recipes: Map<String, PersonalRecipeData>? = null,
    val chefs: Map<String, PersonalChefData>? = null,
    val timestamp: Long = 0,
    val version: String = ""
)

/**
 * 个人菜谱数据
 */
data class PersonalRecipeData(
    val got: Boolean = false,
    val rank: Int = 0
)

/**
 * 个人厨师数据
 */
data class PersonalChefData(
    val got: Boolean = false,
    val rank: Int = 0,
    val ult: Boolean = false, // 是否已修炼
    val equip: Int? = null,   // 装备的厨具ID（可选字段）
    val dlv: Int? = null,     // 心法盘等级（缺省=1）
    val ambers: List<Int>? = null // 已佩戴心法盘ID，长度最多3，0表示无
)
